﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioContaBanco
    {
        private IRepositorioContaBanco _repositorioContaBanco;

        /// <summary>
        /// 
        /// </summary>
        public NegocioContaBanco()
        {
            _repositorioContaBanco = new RepositorioContaBanco();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="contaBanco"></param>
        /// <returns></returns>
        public ContaBanco Inserir(ContaBanco contaBanco)
        {
            return _repositorioContaBanco.Inserir(contaBanco);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="contaBanco"></param>
        /// <returns></returns>
        public ContaBanco Atualizar(ContaBanco contaBanco)
        {
            return _repositorioContaBanco.Atualizar(contaBanco);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="contaBanco"></param>
        public void Excluir(ContaBanco contaBanco)
        {
            ContaBanco contaBancoTmp = ObterPorId(contaBanco.ContaId);
            _repositorioContaBanco.Excluir(contaBancoTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<ContaBanco> ObterTodos()
        {
            return _repositorioContaBanco.ObterTodos();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ContaBanco ObterPorId(int id)
        {
            return _repositorioContaBanco.ObterPorId(id);
        }

        public IList<ContaBanco> ObterPorTipoContaBanco(TipoContaBanco tipoContaBanco)
        {
            return _repositorioContaBanco.ObterPorTipoContaBanco(tipoContaBanco);
        }

        public IList<ContaBanco> ObterPorTitular(Pessoa titular)
        {
            return _repositorioContaBanco.ObterPorTitular(titular);
        }

        public IList<ContaBanco> ObterPorAgencia(Agencia agencia)
        {
            return _repositorioContaBanco.ObterPorAgencia(agencia);
        }

        public IList<ContaBanco> ObterPorNumero(string numero, Pessoa titular, Usuario usuarioPermissao)
        {
            return _repositorioContaBanco.ObterPorNumero(numero, titular);
        }

        public IList<ContaBanco> ObterTodos(
            string numero,
            TipoContaBanco tipoContaBanco,
            string descricao,
            Agencia agencia,
            Pessoa titular,
            Usuario usuarioPermissao
            )
        {
            return _repositorioContaBanco.ObterTodos(numero,tipoContaBanco,descricao,agencia,titular);
        }

        public void VerificarSaldo(ContaBanco contaBanco, decimal valor)
        {
            contaBanco = ObterPorId(contaBanco.ContaId);

            if (contaBanco == null)
            {
                throw new Exception("A Conta selecionada para débito não foi localizada!");
            }

                //Saldo Atual      +     Limite           +       Percentual Limite
            if (contaBanco.SaldoAtual + contaBanco.Limite + ((contaBanco.PercentualLimite * contaBanco.Limite) / 100 )< valor)
            {
                throw new Exception("A Conta selecionada para débito não possui saldo suficiente!");
            }
        }

        public void Creditar(ContaBanco contaBanco, decimal valor)
        {
            contaBanco.SaldoAnterior = contaBanco.SaldoAtual;
            contaBanco.SaldoAtual += valor;
            Atualizar(contaBanco);
        }

        public void Debitar(ContaBanco contaBanco, decimal valor)
        {
            contaBanco.SaldoAnterior = contaBanco.SaldoAtual;
            contaBanco.SaldoAtual -= valor;
            Atualizar(contaBanco);
        }
    }
}